package com.jml.程序员;

import org.junit.Test;

/**
 * 字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。
 * 给定两个字符串，编写一个函数判定它们是否只需要一次(或者零次)编辑就可以得到第二个字符串。
 *
 * 示例 1:
 * 输入:
 * first = "pale"     一次删除操作a
 * second = "ple"
 * 输出: True
 *  
 * 示例 2:
 * 输入:
 * first = "pales"  两次删除操作
 * second = "pal"
 * 输出: False
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/one-away-lcci
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class 一次编辑 {


    @Test
    public void ma(){
        一次编辑 i = new 一次编辑();
        Boolean my = i.my();
        System.out.println(my);
        boolean other = other("abc", "cdd");
        System.out.println(other);
    }

    public Boolean my(){
        String first = "islander";
        String second = "slander";
        int c = first.length()-second.length();
        int j = 0;
        //添加
        if(c==-1){
            //防止"" , "a"
            if(first.length()==0){
                return true;
            }
            for (int i = 0; i < first.length(); i++) {
                if(first.charAt(i)!=second.charAt(i)){
                     j=i+1;
                    if(first.charAt(i)!=second.charAt(j)){
                        return false;
                    }
                    break;
                }
            }
            //防止"a" "ab"
            if(j==0){
                return true;
            }
            for (int i = j-1; i < first.length(); i++) {
                if(first.charAt(i)!=second.charAt(j)){
                    return false;
                }
                j++;
            }
        }else if(c==1){//删除
            //防止"a" ,""
            if(first.length()==1&&second.length()==0){
                return true;
            }
            for (int i = 0; i < first.length()-1; i++) {
                if(first.charAt(i)!=second.charAt(i)){
                    j=i+1;
                    if(first.charAt(j)!=second.charAt(i)){
                        return false;
                    }
                    break;
                }
            }
            if(j==0){
                return true;
            }
            for (int i = j-1; j < first.length(); j++) {
                if(first.charAt(j)!=second.charAt(i)){
                    return false;
                }
                i++;
            }
        }else if(c==0){//不变
            if(first.length()==0){
                return true;
            }
            int flag = 0;
            for (int i = 0; i < first.length(); i++) {
                if(first.charAt(i)!=second.charAt(i)){
                     flag++;
                     if(flag>1){
                         return false;
                     }
                }
            }

        }else{
            return false;
        }
        return true;
    }


    /**
     * 判断长度差别是否满足一位以内，超过一位返回false。对比两个字符串通用下标的字符是否相同，第一次出现字符不同采取相应措施，第二次出现则返回false：
     *
     * 如果a、b字符串一样长，则第一次碰到字符不同的时候跳过
     * 如果a、b字符串不一样长，则第一次碰到字符不同的时候长的字符串的下标前进一位以后再比较
     */
    public boolean other(String first, String second) {
        //判断长度差别是否满足一位以内
        int a=first.length()-second.length();
        if (a>1||a<-1){
            return false;
        }
        char[] chars1 = first.toCharArray();
        char[] chars2 = second.toCharArray();
        //只能跳过一次
        boolean hasContinue=false;
        for (int i = 0,j=0; i < chars1.length&&j<chars2.length; i++,j++) {
            if (chars1[i]==chars2[j]){
                continue;
            }else if(hasContinue){
                return false;
            }
            //添加元素
            if (a==1){
                j--;
            }else if(a==-1){//删除元素
                i--;
            }
            //跳转位置后，修改标识符
            hasContinue=true;
        }
        return true;
    }
}
